package geekTime.chapter5deadlock;

/**
 * 通过破坏占用且等待条件跳出线程死锁
 * 不再是一个一个的获取所需资源，而是一次性获取到所有需要的资源
 * Created by LinGer on 2019/6/26
 */
public class Account {

    private Allocator actr;
    private int balance;

    /**
     * 转账
     * @param target 对方账户
     * @param amt
     */
    public void transfre(Account target, int amt){
        //一次性申请转出账户和转入账户，直到成功
        while (!actr.apply(this, target)){
            //只有当actr一开始不包含this和target时，当前线程才能成功获得所有的资源
        }

        try{
            //锁定转出账户
            synchronized (this){
                //锁定转入账户
                synchronized (target){
                    if(this.balance > amt){
                        this.balance -= amt;
                        target.balance += amt;
                    }
                }
            }
        }finally {
            actr.free(this, target);
        }
    }
}
